package com.zx._15_应用.短链;

import java.util.concurrent.TimeUnit;
import org.openjdk.jmh.annotations.Benchmark;
import org.openjdk.jmh.annotations.BenchmarkMode;
import org.openjdk.jmh.annotations.Mode;
import org.openjdk.jmh.annotations.OutputTimeUnit;
import org.openjdk.jmh.annotations.Param;
import org.openjdk.jmh.annotations.Scope;
import org.openjdk.jmh.annotations.Setup;
import org.openjdk.jmh.annotations.State;
import org.openjdk.jmh.annotations.TearDown;
import org.openjdk.jmh.runner.options.Options;
import org.openjdk.jmh.runner.options.OptionsBuilder;

@BenchmarkMode(Mode.SampleTime)
@OutputTimeUnit(TimeUnit.SECONDS)
@State(Scope.Benchmark)
public class ShortUrlBenchmark {

    // 2. 属性级注解，@Param 可以用来指定某项参数的多种情况。特别适合用来测试一个函数在不同的参数输入的情况下的性能。
    @Param({"1000", "10000", "100000"})
    public int count = 1000000000;

    public static void main(String[] args) throws Exception {
        Options opt = new OptionsBuilder()
                // 可以用方法名
                .include(ShortUrlBenchmark.class.getSimpleName())
                //  forks(2)指的是做2轮测试，
                .forks(2)
                // 预热2轮
                .warmupIterations(2)
                .build();
        //new Runner(opt).run();

        int sum = 0;
        int num = 5;
        ShortUrlBenchmark benchmark = new ShortUrlBenchmark();
        for (int i = 0; i < num; i++) {
            long a = System.currentTimeMillis();
            benchmark.run();
            long b = System.currentTimeMillis();
            System.out.println(b - a);
            sum += b - a;
        }
        int avg = sum / num;
        int speed = benchmark.count / (avg / 1000);
        // end:45439, speed:22222222
        System.out.println("end:" + avg + ", speed:" + speed);
    }

    @Benchmark
    public void run() {
        for (int i = 0; i < count; i++) {
            数字生成短链.to62(999999999999L);
        }
    }


    // 3. 方法级注解，这个注解的作用就是我们需要在测试之前进行一些准备工作，比如对一些数据的初始化之类的。
    @Setup
    public void prepare() {
    }

    // 4. 方法级注解，这个注解的作用就是我们需要在测试之后进行一些结束工作，比如关闭线程池，数据库连接等的，主要用于资源的回收等
    @TearDown
    public void shutdown() {
    }

}
